<?php
/**
 * BaseController.class.php
 * 微信基类控制器
 *
 * @author  王中艺
 * @date    2016-09-21
 */

namespace Wechat\Controller;
use Think\Controller;

class BaseController extends Controller {
    //微信操作类
    public  $wechat;
    //授权信息
    public  $authInfo;
    //用户信息
    public  $userInfo;
    //输出信息
    public  $oInfo  = array();
    //输入信息
    public  $iInfo  = array();

    function _initialize(){
        $this->wechat   = \Wechat\Util\WechatExt::getInstance();
        //PUBLIC控制器取消权限检测
        if(strtolower(CONTROLLER_NAME) != 'public'){
            $this->signUserInfo();
        }

        //VIP及用户绑定检测
        $userInfo   = C('USER');
        if(in_array(strtolower(CONTROLLER_NAME), ['radiomorning', 'radioevening', 'activity'])){
            if(!$userInfo['username']){
                $this->response("听出健康，听出安全，和孩子免费体验5天。", 302);
            }
            if(!$userInfo['vip_level']){
                $this->response("卓越在于坚持！为孩子订阅1整年， 每天进步一点点！", 304);
            }
        }
        // if(strtolower(CONTROLLER_NAME) == 'user' && strtolower(ACTION_NAME) == 'purchasevip'){
        //     if(!$userInfo['username']){
        //         $this->response("听出健康，听出安全，和孩子免费体验5天。", 302);
        //     }
        // }

        //输入信息写入
        $get    = I('get.');
        $post   = json_decode(file_get_contents('php://input'), true);
        $post   = $post ? $post : array();
        $this->iInfo    = array_merge($get, $post);
        $this->checkIinfo($this->iInfo);
    }

    /**
     * 注册用户信息
     * Oauth授权
     */
    private function signUserInfo(){
        $userId     = S('user_id_'.session_id());
        $userInfo   = S('user_info_'.$userId);

        if(!$userId || !$userInfo){
            if(C('APP_STAGE') >= 2){
                $wxOauth    = S('wx_oauth_'.session_id());
                if(!$wxOauth){
                    if(!I('get.code')){
                        $this->outOInfo('Code参数获取失败!', 102);
                    }
                    $wxOauth   = $this->wechat->getOauthAccessToken();
                    if(!$wxOauth){
                        $this->outOInfo('Oauth授权过期,请回返回微信重新登录!', 104);
                    }
                    S('wx_oauth_'.session_id(), $wxOauth, 7200);
                }
                
                $userInfo   = D('User')->getUserInfo($wxOauth['openid']);
                //本地未找到用户信息则去微信服务区拉取
                if(!$userInfo){
                    $userInfo   = $this->wechat->getUserInfo($wxOauth['openid']);
                    //将信息添加至本地
                    $userInfo['id']    = D('User')->addUser($userInfo);
                    //注册用户关系连信息
                    D('User')->addUserRelaInfo($userInfo['id'], [
                        'dean_id'   => -1,
                        'expand_id' => -1,
                        'teacher_id'    => -1,
                        'parent_id' => 0
                    ]);
                }
                $userId     = $userInfo['id'];

                S('user_id_'.session_id(), $userId);
                S('user_info_'.$userId, $userInfo);
            }else{
                $userId     = 31;
                $userInfo   = D('User')->getUserInfo($userId); 
            }
        }
        
        if(!$userInfo['role_id'] && $userInfo['status']){
			write_log('./Log/error.log', 'UnvalidRoleId', $userInfo);
            if(!D('User')->changeUserRole($userInfo['id'], 106)){
                write_log('./Log/error.log', 'ChangeUserRole', [
                    'param' => [$userInfo['id'], 106],
                    'msg'   => D('User')->errMsg
                ]);
            }
			$this->outOInfo('出现未知错误，请重试或联系管理员！', 0);
        }
        //用户信息注册
        C('USER', $userInfo);
    }

    /**
     * 检测客户端参数
     * @param   $info
     * @return  boolean
     */
    function checkIinfo($params){
        $numberP    = array(
            'type','page','course_id', 'date_start', 'date_end', 'amount',
            'child_relative', 'child_sex', 'chapter_id', 'user_id', 'child_age',
            'qq', 'mobile', 'school_teachers', 'school_students', 'goods_type', 'score',
            'relate_type', 'relate_id', 'activity_id'
        );
        $arrayP     = array('goods_ids', 'child_pics', 'parent_pics');
        foreach($params as $key=>$val){
            //数值类型参数检测
            if(in_array($key, $numberP)){
                if(!is_numeric($val))
                    $this->outOInfo('参数['.$key.']类型不正确!', 0);
            }
            //数组类型参数检测
            if(in_array($key, $arrayP)){
                if(!is_array($val))
                    $this->outOInfo('参数['.$key.']类型不正确!', 0);
            }
            //手机号检测
            if($key == 'mobile'){
                if(strlen($val) != 11 || !is_numeric($val))
                    $this->outOInfo('手机号类型不正确!', 0);
            }
        }
    }

    /**
     * 非空参数检测
     * @param  arra $params 非空参数组
     * @return null         
     */
    function unEmptyParam($params){
        foreach($params as $param){
            if(!$this->iInfo[$param])
                $this->outOInfo('参数'.$param.'未找到!', 0);
        }
    }

    /**
     * 获取请求参数
     * @param   $key 参数名
     * @param   $default    默认值
     * @return  $value
     */
    function request($key, $default = null){
        return (isset($this->iInfo[$key]) && $this->iInfo[$key]) ? 
            $this->iInfo[$key] : $default;
    }
    
    /**
     * 设置输出数据信息
     * @param   $key    键名
     * @param   $val    数值
     */
    function setOInfo($key, $val){
        $this->oInfo['data'][$key]  = $val;
    }

    /**
     * 输出信息
     * @param   $data   输出数据 or 提示信息
     * @param   $code   运行状态码 1：成功 other：失败
     */
    function outOInfo($data = 'Oh yes!', $code = 1){
        $this->response($data, $code);
    }

    /**
     * 输出信息
     * @param   $data   输出数据 or 提示信息
     * @param   $code   运行状态码 1：成功 other：失败
     */
    function response($data = 'Oh yes!', $code = 1){
        $this->oInfo['code']    = $code;

        if($data){
            if(is_array($data)){
                $this->oInfo['data']    = array_merge((array)$this->oInfo['data'], $data);
            }
            if(is_string($data)){
                $this->oInfo['data']    = $data;
            }
        }
        
        \Think\Log::record(json_encode($this->iInfo), 'INFO');
        \Think\Log::record(json_encode($this->oInfo), 'INFO');
        \Think\Log::save();

        echo json_encode(filter_float($this->oInfo));
        exit;
    }
}
